import axios, { AxiosError, type AxiosResponse } from 'axios'
import { clearAllInfo, getJwt } from './token'
import { ElMessage } from 'element-plus'
import { type Socket, io } from 'socket.io-client'
import 'element-plus/theme-chalk/el-message.css'
import type { Res } from '@/types'
import router from '@/router'
const req = axios.create({
  baseURL: location.origin + '/api'
})

// 请求拦截
req.interceptors.request.use(
  (config) => {
    const token = getJwt() // 从本地存储中获取 JWT
    if (token) {
      config.headers['Authorization'] = `${token}` // 在请求头中添加 Authorization 字段
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

req.interceptors.response.use(
  (response) => {
    // 如果后端返回的数据响应状态码为 200 就把数据从响应中解析出来
    if (response.status === 200) {
      const d = response.data as unknown as Res<any>
      // 解析数据的时候先判断 数据状态码 若是出现特殊状态码就进行相应处理
      if (d.code === 303) {
        // 用户身份信息过期
        ElMessage.error({
          message: d.msg,
          duration: 2000
        })
        // 清除用户的缓存信息
        clearAllInfo()
        // 并且将用户导航至 登陆页面提示用户登陆
        router.replace({
          name: 'login'
        })
        // throw d
      } else if (d.code === 403) {
        // 接口没有权限的情况报错处理
        ElMessage.error({
          message: d.msg,
          duration: 2000
        })
        throw d
      } else if (d.code > 300) {
        // 其他非正常状态
        throw d
      }
      // 所有的都通过过后 把数据 结构并返回出去
      // 该数据的类型为 Res<any>
      return d as unknown as AxiosResponse<Res<any>>
    }
    return response
  },
  (error: AxiosError) => {
    if ((error.response?.status || 0) >= 500) {
      ElMessage.error({
        message: '服务器内服错误请稍后重试',
        duration: 2000
      })
    } else if ((error.response?.status || 0) >= 400) {
      ElMessage.error({
        message: `找不到系统接口${error?.request?.responseURL}`,
        duration: 2000
      })
    }
    return Promise.reject({ msg: '出错了！！！' })
  }
)
export { req }

export function SConnect(ns: string = ''): Socket {
  return io(location.host + ns, {
    query: {
      token: getJwt()
    },
    transports: ['websocket', 'polling'],
    extraHeaders: {
      token: getJwt()!
    },
    timeout: 5000
  })
}

/**
 * 用户判断地址是否为后台服务器地址 是的话 需要使用代理解决跨域
 * @param url 目标地址
 * @returns
 */
export function UrlFormat(url: string) {
  if (!url) return 'User'
  try {
    new URL(url)
    return url
  } catch {
    return `${location.origin}/api${url}`
  }
}
